package com.papa91.wrapper;

import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Build;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;

/**
 * An API 11+ implementation of {@link SystemUiHider}. Uses APIs available in
 * Honeycomb and later (specifically {@link View#setSystemUiVisibility(int)}) to
 * show and hide the system UI.
 */
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
class SystemUiHiderHoneycomb extends SystemUiHiderBase
{
	/**
	 * Flags for {@link View#setSystemUiVisibility(int)} to use when showing the
	 * system UI.
	 */
	private int mShowFlags;

	/**
	 * Flags for {@link View#setSystemUiVisibility(int)} to use when hiding the
	 * system UI.
	 */
	private int mHideFlags;

	/**
	 * Flags to test against the first parameter in
	 * {@link View.OnSystemUiVisibilityChangeListener#onSystemUiVisibilityChange(int)}
	 * to determine the system UI visibility state.
	 */
	private int mTestFlags;

	/**
	 * Whether or not the system UI is currently visible. This is cached from
	 * {@link View.OnSystemUiVisibilityChangeListener}.
	 */
	private boolean mVisible = true;

	/**
	 * Constructor not intended to be called by clients. Use
	 * {@link SystemUiHider#getInstance} to obtain an instance.
	 */
	protected SystemUiHiderHoneycomb(Activity activity, View anchorView, int flags)
	{
		super(activity, anchorView, flags);

		mShowFlags = View.SYSTEM_UI_FLAG_VISIBLE;
		mHideFlags = View.SYSTEM_UI_FLAG_LOW_PROFILE;
		mTestFlags = View.SYSTEM_UI_FLAG_LOW_PROFILE;

		if ((mFlags & FLAG_FULLSCREEN) != 0)
		{
			// If the client requested fullscreen, add flags relevant to hiding
			// the status bar. Note that some of these constants are new as of
			// API 16 (Jelly Bean). It is safe to use them, as they are inlined
			// at compile-time and do nothing on pre-Jelly Bean devices.
//			mShowFlags |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
			mHideFlags |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
					| View.SYSTEM_UI_FLAG_FULLSCREEN;
		}

		if ((mFlags & FLAG_HIDE_NAVIGATION) != 0)
		{
			// If the client requested hiding navigation, add relevant flags.
//			mShowFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
//			mHideFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
//					| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
			mTestFlags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
		}
	}

	/** {@inheritDoc} */
	@Override
	public void setup()
	{
		mAnchorView
				.setOnSystemUiVisibilityChangeListener(mSystemUiVisibilityChangeListener2);
	}

	/** {@inheritDoc} */
	@Override
	public void hide()
	{
		mAnchorView.setSystemUiVisibility(mHideFlags);
		if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT) {
			mAnchorView.setSystemUiVisibility(mHideFlags|View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
					|View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
					|View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
		}
	}

	/** {@inheritDoc} */
	@Override
	public void show()
	{
		//mActivity.getActionBar().show();
		mAnchorView.setSystemUiVisibility(mShowFlags);
	}

	/** {@inheritDoc} */
	@Override
	public boolean isVisible()
	{
		return mVisible;
	}
	
	private View.OnSystemUiVisibilityChangeListener mSystemUiVisibilityChangeListener2 = new View.OnSystemUiVisibilityChangeListener() {
		
		@Override
		public void onSystemUiVisibilityChange(int visibility) {
			if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
			{
				// Pre-Jelly Bean, we must manually hide the action bar
				// and use the old window flags API.
				//mActivity.getActionBar().hide();
				mActivity.getWindow().setFlags(
						WindowManager.LayoutParams.FLAG_FULLSCREEN,
						WindowManager.LayoutParams.FLAG_FULLSCREEN);
			}

			// Trigger the registered listener and cache the visibility
			// state.
			mOnVisibilityChangeListener.onVisibilityChange(false);
			mVisible = false;
		}
	};

	private View.OnSystemUiVisibilityChangeListener mSystemUiVisibilityChangeListener = new View.OnSystemUiVisibilityChangeListener()
	{
		@Override
		public void onSystemUiVisibilityChange(int vis)
		{
			
			Log.d("onSystemUiVisibilityChange", "onSystemUiVisibilityChange");

			// Test against mTestFlags to see if the system UI is visible.
			if ((vis & mTestFlags) != 0)
			{
				if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
				{
					// Pre-Jelly Bean, we must manually hide the action bar
					// and use the old window flags API.
					//mActivity.getActionBar().hide();
					mActivity.getWindow().setFlags(
							WindowManager.LayoutParams.FLAG_FULLSCREEN,
							WindowManager.LayoutParams.FLAG_FULLSCREEN);
				}

				// Trigger the registered listener and cache the visibility
				// state.
				mOnVisibilityChangeListener.onVisibilityChange(false);
				mVisible = false;

			}
			else
			{
				mAnchorView.setSystemUiVisibility(mShowFlags);
				if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
				{
					// Pre-Jelly Bean, we must use the old window flags API.
					mActivity.getWindow().setFlags(0,
							WindowManager.LayoutParams.FLAG_FULLSCREEN);
				}

				// Trigger the registered listener and cache the visibility
				// state.
				mOnVisibilityChangeListener.onVisibilityChange(true);
				mVisible = true;
			}
			
		}
	};
}
